\section{Ontwerp Car Rental applicatie}

\subsection{Deployment Diagramma}
\label{deployment_diagramma}

\npar Het Deployment diagramma (zie figuur \ref{fig:deployment_diagramma}) bestaat uit 3 logische componenten. Allereerst is
er de Client. Deze client is voorgesteld als een aparte entiteit omdat de client
natuurlijk de boeking wil maken vanop zijn eigen machine. 

\npar Elke client zal dan kunnen communiceren met het systeem via zijn eigen
ClientSession die aangemaakt en beheerd wordt door de Sessionmanager. De Client
zal zijn eigen sessie dus altijd benaderen via de Sessionmanager. Op deze
centrale server is er naast de SessionManager ook nog een NamingServer aanwezig.
Alle (nieuwe) CarRentalCompany's moeten zich bij deze Naming server komen
registeren. Op deze manier kan de client dan op \'e\'en locatie referenties
naar alle CarRentalCompanies terugvinden.

\npar Als laatste component is er nog de CarRentalCompanyServer. Elk bedrijf
heeft zijn eigen server en moet zich registeren bij de NamingServer om zo
benaderd te kunnen worden door een client.

\begin{figure}
	\begin{center}
		\includegraphics[width=0.6\textwidth]{figs/deployment_diagramma.pdf}
		\caption{Het deployment diagramma voor de Car Rental applicatie.}
		\label{fig:deployment_diagramma}
	\end{center}
\end{figure}

\subsection{Klassen Diagramma}
\label{klassen_diagramma}

\npar In het klassendiagramma zitten 3 grote packages, elk met zijn
overeenkomstige component uit het deployment diagramma. 

\npar Als eerste is er de centrale server. Deze fungeert als aanmeldpunt voor de
verschillende CarRentalCompanies en houdt tevens de sessies van de clients en de
managers bij.Een belangrijke component is de \class{NamingServer} die
ge\"implementeerd is volgens het Singleton patroon. Deze klasse is enkel
bereikbaar via instanties van de \class{ManagerSession} en
\class{ClientSession} klassen. De managers van de auto verhuur bedrijven kunnen
op die manier via de aangeboden interface (\interface{IManagerSession}) het
bedrijf registeren en ``deregisteren'', alle bedrijven opvragen en informatie
over auto's en reservaties opvragen. Het gebruik van het Singleton patroon laat
verschillende \class{ManagerSession}s toe om gelijktijdig dezelfde NamingServer
aan te spreken zonder het risico te lopen dat verschillende instanties zouden
aangeroepen worden. Naast de \class{ManagerSession}s worden ook de
\class{ClientSession}s bijgehouden op de centrale server, vergezeld door de
\interface{IClientSession} interface. Deze sessies gebruiken de
\class{NamingServer} voor het reserveren van auto's, etc. De eigenlijke
communicatie (via RMI) tussen de centrale server en andere servers (bvb.
\class{CarRentalCompanies} of de client) gebeurt via de \class{SessionManager}.
De bijhorende remote interface, \interface{ISessionManager}, maakt de RMI
communicatie mogelijk. Deze interface verbindt de \class{SessionManager} ertoe
om 2 methodes aan te bieden, getNewClientSession() en getNewManagerSession().
Deze methodes worden door respectievelijk clients en managers aangeroepen om te
reserveren, informatie op te halen, etc. Merk op dat de SessionManager geen
sessies bijhoudt omdat er enkel informatie moet bijgehouden worden zo lang de
sessie loopt. Als bvb. de client later een nieuwe reservatie wil maken, dan is
de informatie van voorgaande reservaties onbelangrijk.

\npar De client is beperkt en bevat slecht 1 klasse \class{Client} die een main
methode heeft waarin het (test) programma wordt opgestart.

\npar Als laatste is er nog het Applicatie package. De klassen hierin zijn
hoofdzakelijk de klassen die gegeven waren bij de eerste java RMI sessie. Om het
overzicht te bewaren zijn de klassen waar niks aan veranderd is dan ook zonder
methodes of attributen overgenomen uit de opgave. Gezien de informatie die
buiten de applicatie server beschikbaar moet zijn is het een logische keuze om
de \class{CarRentalCompany} als enige remote beschikbaar te maken door de
\interface{ICarRentalCompany} te implementeren. Deze voorziet alle nodige
functionaliteit om reservaties te maken, te annuleren en allerlei informatie op
te vragen. Daarbij worden natuurlijk een aantal klassen vanop deze server
doorgestuurd (via RMI) naar de centrale server die allen dus serialiseerbaar
zijn gemaakt. Concreet gaat het over: \class{ReservationConstraints},
\class{CarType} en \class{Quote}.

\npar Zoals eerder vermeld gaat het in dit systeem over een ``multi-user
system''. Dit betekent dat er heel wat kan fout lopen! Denk daarbij bijvoorbeeld
aan het gelijktijdig boeken van eenzelfde wagen, etc. Daarom zijn de methodes
omtrent reservaties in een CarRentalCompany synchronized gemaakt.

\begin{figure}
	\begin{center}
		\includegraphics[width=0.9\textwidth]{figs/klassen_diagramma.pdf}
		\caption{Het klassen diagramma voor de gedistribueerde Car Rental applicatie.}
		\label{fig:klassen_diagramma}
	\end{center}
\end{figure}


\subsection{Sequentie Diagramma's}
\label{sequentie_diagrammas}

\subsubsection{Auto's reserveren}
\label{autos_reserveren}

\npar In deze sectie zal het sequentie diagramma voor het reserveren van enkele
auto's worden besproken. Het diagramma is te zien in figuur
\ref{fig:sequentie_diagramma}.

\npar De client begint met een nieuwe sessie aan te vragen. Deze wordt
aangemaakt aan de serverzijde en de referentie wordt teruggegeven aan de client.
Vervolgens begint de client met het selecteren van een verhuurbedrijf. De
clientsession zal dan aan de hand van deze keuze de juiste referentie ophalen
van de NamingServer. Vanaf dit moment kunnen beschikbare auto's bekeken worden
en quotes aangemaakt worden. Indien de client klaar is met het aanmaken van
quotes kan hij aangeven dat hij van verhuurbedrijf wil wisselen. De
clientsession zal dan weer de NamingServer aanspreken om de juiste referentie op
te halen. Ook bij dit bedrijf kan de client beschikbare auto's bekijken en
quotes aanmaken.

\npar Zodra de client klaar is met het aanmaken van quotes bij verschillende
bedrijven, kan hij al deze quotes bevestigen. Indien op het moment van
bevestigen alle quotes nog steeds beschikbaar zijn, zullen de reservaties
\'e\'en voor \'e\'en aangemaakt worden. Dit gebeurt door aan elke quote te
vragen bij welk bedrijf hij gemaakt is, en vervolgens de juiste referentie aan
te vragen bij de NamingServer. Als het bedrijf gekend is, kan de quote bevestigd
worden en zal een reservatie teruggegeven worden.

\npar Het kan ook voorvallen dat een quote niet meer bevestigd kan worden.
CarRentalCompany kan dan een ReservationException opgooien. Als dit gebeurt
moeten alle eerder bevestigde quotes gecancelled worden. Dit gebeurt door aan
elke reservatie te vragen bij welk bedrijf ze zijn aangemaakt en vervolgens aan
de NamingServer de juiste referentie op te vragen. Als de juiste referentie
gekend is kan de reservatie ook geannuleerd worden. Dit gebeurt voor elke
reservatie in de lijst. Als alle reeds gemaakte reservaties geannuleerd zijn,
wordt de ReservationException doorgegeven aan de client. 

\begin{figure}
	\begin{center}
		\includegraphics[width=1\textwidth]{figs/sequentie_diagramma.pdf}
		\caption{Het sequentie diagramma voor het reserveren van enkele auto's met een optionele rollback.}
		\label{fig:sequentie_diagramma}
	\end{center}
\end{figure}


\subsubsection{Alle reservaties per type}
\label{reservaties_per_type}

In figuur \ref{fig:reservations_by_cartype} is het sequentie diagramma voor het ophalen van alle reservaties van \'e\'en auto type te zien.
De manager begint met een manager sessie aan te vragen. Vervolgens kan de client een lijst opvragen van alle reservaties voor \'e\'en auto type. De managersession zal itereren over alle namen van de CarRentalCompanies die aanwezig zijn in de NamingServer. Bij elke iteratie wordt de juiste referentie naar een CarRentalCompany opgehaald. Bij elke CarRentalCompany wordt dan de lijst met reservaties bij \'e\'en auto type opgehaald. Als alle CarRentalCompanies overlopen zijn wordt de combinatie van alle lijsten teruggegeven naar de client.

\begin{figure}
	\begin{center}
		\includegraphics[width=1\textwidth]{figs/ReservationsByCarType.pdf}
		\caption{Het sequentie diagramma voor het ophalen van alle reservaties voor een auto type.}
		\label{fig:reservations_by_cartype}
	\end{center}
\end{figure}

\subsubsection{Bedrijf registreren}
\label{registreren}

Figuur \ref{fig:register} toont het sequentie diagramma voor het registreren van een bedrijf in de namingserver. Een manager moet eerst een sessie aanmaken alvorens hij zijn bedrijf kan registreren. De manager geeft de naam  van zijn bedrijf door aan de \class{SessionManager} die het op zijn beurt doorgeeft aan de \class{NamingServer}. Daar zal een nieuw bedrijf worden aangemaakt en toegevoegd worden aan de lijst van verhuurbedrijven. Dit kan echter beter aangepast worden zodat een manager zijn bedrijf kan meegeven als parameter.

\begin{figure}
	\begin{center}
		\includegraphics[width=1\textwidth]{figs/Register.pdf}
		\caption{Het sequentie diagramma voor registreren van een verhuurbedrijf.}
		\label{fig:register}
	\end{center}
\end{figure}

